home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / rdma / ib_addr.h next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  5.2 KB  |  161 lines

  1. /*
  2.  * Copyright (c) 2005 Voltaire Inc.  All rights reserved.
  3.  * Copyright (c) 2005 Intel Corporation.  All rights reserved.
  4.  *
  5.  * This software is available to you under a choice of one of two
  6.  * licenses.  You may choose to be licensed under the terms of the GNU
  7.  * General Public License (GPL) Version 2, available from the file
  8.  * COPYING in the main directory of this source tree, or the
  9.  * OpenIB.org BSD license below:
  10.  *
  11.  *     Redistribution and use in source and binary forms, with or
  12.  *     without modification, are permitted provided that the following
  13.  *     conditions are met:
  14.  *
  15.  *      - Redistributions of source code must retain the above
  16.  *        copyright notice, this list of conditions and the following
  17.  *        disclaimer.
  18.  *
  19.  *      - Redistributions in binary form must reproduce the above
  20.  *        copyright notice, this list of conditions and the following
  21.  *        disclaimer in the documentation and/or other materials
  22.  *        provided with the distribution.
  23.  *
  24.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  25.  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  26.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  27.  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  28.  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  29.  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  30.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  31.  * SOFTWARE.
  32.  */
  33.  
  34. #if !defined(IB_ADDR_H)
  35. #define IB_ADDR_H
  36.  
  37. #include <linux/in.h>
  38. #include <linux/in6.h>
  39. #include <linux/netdevice.h>
  40. #include <linux/socket.h>
  41. #include <rdma/ib_verbs.h>
  42.  
  43. struct rdma_addr_client {
  44.     atomic_t refcount;
  45.     struct completion comp;
  46. };
  47.  
  48. /**
  49.  * rdma_addr_register_client - Register an address client.
  50.  */
  51. void rdma_addr_register_client(struct rdma_addr_client *client);
  52.  
  53. /**
  54.  * rdma_addr_unregister_client - Deregister an address client.
  55.  * @client: Client object to deregister.
  56.  */
  57. void rdma_addr_unregister_client(struct rdma_addr_client *client);
  58.  
  59. struct rdma_dev_addr {
  60.     unsigned char src_dev_addr[MAX_ADDR_LEN];
  61.     unsigned char dst_dev_addr[MAX_ADDR_LEN];
  62.     unsigned char broadcast[MAX_ADDR_LEN];
  63.     enum rdma_node_type dev_type;
  64.     struct net_device *src_dev;
  65. };
  66.  
  67. /**
  68.  * rdma_translate_ip - Translate a local IP address to an RDMA hardware
  69.  *   address.
  70.  */
  71. int rdma_translate_ip(struct sockaddr *addr, struct rdma_dev_addr *dev_addr);
  72.  
  73. /**
  74.  * rdma_resolve_ip - Resolve source and destination IP addresses to
  75.  *   RDMA hardware addresses.
  76.  * @client: Address client associated with request.
  77.  * @src_addr: An optional source address to use in the resolution.  If a
  78.  *   source address is not provided, a usable address will be returned via
  79.  *   the callback.
  80.  * @dst_addr: The destination address to resolve.
  81.  * @addr: A reference to a data location that will receive the resolved
  82.  *   addresses.  The data location must remain valid until the callback has
  83.  *   been invoked.
  84.  * @timeout_ms: Amount of time to wait for the address resolution to complete.
  85.  * @callback: Call invoked once address resolution has completed, timed out,
  86.  *   or been canceled.  A status of 0 indicates success.
  87.  * @context: User-specified context associated with the call.
  88.  */
  89. int rdma_resolve_ip(struct rdma_addr_client *client,
  90.             struct sockaddr *src_addr, struct sockaddr *dst_addr,
  91.             struct rdma_dev_addr *addr, int timeout_ms,
  92.             void (*callback)(int status, struct sockaddr *src_addr,
  93.                      struct rdma_dev_addr *addr, void *context),
  94.             void *context);
  95.  
  96. void rdma_addr_cancel(struct rdma_dev_addr *addr);
  97.  
  98. int rdma_copy_addr(struct rdma_dev_addr *dev_addr, struct net_device *dev,
  99.           const unsigned char *dst_dev_addr);
  100.  
  101. static inline int ip_addr_size(struct sockaddr *addr)
  102. {
  103.     return addr->sa_family == AF_INET6 ?
  104.            sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in);
  105. }
  106.  
  107. static inline u16 ib_addr_get_pkey(struct rdma_dev_addr *dev_addr)
  108. {
  109.     return ((u16)dev_addr->broadcast[8] << 8) | (u16)dev_addr->broadcast[9];
  110. }
  111.  
  112. static inline void ib_addr_set_pkey(struct rdma_dev_addr *dev_addr, u16 pkey)
  113. {
  114.     dev_addr->broadcast[8] = pkey >> 8;
  115.     dev_addr->broadcast[9] = (unsigned char) pkey;
  116. }
  117.  
  118. static inline void ib_addr_get_mgid(struct rdma_dev_addr *dev_addr,
  119.                     union ib_gid *gid)
  120. {
  121.     memcpy(gid, dev_addr->broadcast + 4, sizeof *gid);
  122. }
  123.  
  124. static inline void ib_addr_get_sgid(struct rdma_dev_addr *dev_addr,
  125.                     union ib_gid *gid)
  126. {
  127.     memcpy(gid, dev_addr->src_dev_addr + 4, sizeof *gid);
  128. }
  129.  
  130. static inline void ib_addr_set_sgid(struct rdma_dev_addr *dev_addr,
  131.                     union ib_gid *gid)
  132. {
  133.     memcpy(dev_addr->src_dev_addr + 4, gid, sizeof *gid);
  134. }
  135.  
  136. static inline void ib_addr_get_dgid(struct rdma_dev_addr *dev_addr,
  137.                     union ib_gid *gid)
  138. {
  139.     memcpy(gid, dev_addr->dst_dev_addr + 4, sizeof *gid);
  140. }
  141.  
  142. static inline void ib_addr_set_dgid(struct rdma_dev_addr *dev_addr,
  143.                     union ib_gid *gid)
  144. {
  145.     memcpy(dev_addr->dst_dev_addr + 4, gid, sizeof *gid);
  146. }
  147.  
  148. static inline void iw_addr_get_sgid(struct rdma_dev_addr *dev_addr,
  149.                     union ib_gid *gid)
  150. {
  151.     memcpy(gid, dev_addr->src_dev_addr, sizeof *gid);
  152. }
  153.  
  154. static inline void iw_addr_get_dgid(struct rdma_dev_addr *dev_addr,
  155.                     union ib_gid *gid)
  156. {
  157.     memcpy(gid, dev_addr->dst_dev_addr, sizeof *gid);
  158. }
  159.  
  160. #endif /* IB_ADDR_H */
  161.